# -*- coding: utf-8 -*-
# __author__ = 'BIN'

from selenium import webdriver
import db_intf
import log_intf
import time


# 获取数据库获取需要抓取的信息
def get_spider_list():
    global g_keyword_list
    global b_running
    g_keyword_list = []
    b_running = False
    conn, cur = db_intf.conn_db()
    # 关键字为空时进行全文搜索  有内容时则进行关键字搜索
    sql = "SELECT ID,SRC_WEB,SRC_LINK,SRC_KEYWORD,TIME_OUT FROM spider_src_web WHERE TRIM(SRC_KEYWORD)<>'' "
    db_intf.qry_sql(cur, sql)
    if cur.rowcount > 0:
        for row in cur:
            if row[4] != '':
                temp_list = row[3].split('、')
                for items in temp_list:
                    row_list = [row[0], row[1], row[2], items, row[4]]
                    # print(row_list)
                    g_keyword_list.append(row_list)
        print(g_keyword_list)
        b_running = True
    else:
        b_running = False
        log_intf.error_log('【未定义抓取信息】'+sql)
    db_intf.close_db(conn, cur)


# 根据#g_keyword_list循环抓取数据
# selenium
def start_spider():
    # chrome设置不显示图片
    options = webdriver.ChromeOptions()
    options.add_experimental_option("prefs", {'profile.default_content_settings.images': 2})
    # 一次循环后退出浏览器，清下浏览器内存，防卡
    driver = webdriver.Chrome(chrome_options=options)   # 启用Chrome
    last_id = ''
    global spider_items
    global spider_items_href
    spider_items = []
    spider_items_href = []
    # 循环关键字取值
    for key_list in g_keyword_list:
        # 判断是新建，且增加异常处理，在页面异常时能进入到下个站点进行处理
        try:
            if last_id != key_list[0]:
                if last_id != '':
                    pass    # time.sleep(5)  暂停5秒，实际上不需要，打开网站有时间差，不易控制
                insert_spider_db()                                                   # 插入数据库报台记录
                log_intf.running_log('【打开网页】'+key_list[1]+' '+key_list[2])     # 运行日志
                # driver.set_page_load_timeout(key_list[4])                           # 超时设置
                # 此处需增加屏蔽图片功能，加载图片影响速度
                driver.get(key_list[2])                                              # 打开新链接地址
            # 返回list ( driver.find_element_by_link_text 返回单条记录)
            link_items = driver.find_elements_by_partial_link_text(key_list[3])      # 获取链接信息
            for items in link_items:
                # 链接地址不在已有列表记录中时且不为空时
                if (items.get_attribute("href") not in spider_items_href) and (items.get_attribute("href") != '') and (items.get_attribute("href") != None):
                    now_items = [key_list[1], key_list[2], key_list[3]]
                    now_items.append(items.text)
                    spider_items.append(now_items)
                    spider_items_href.append(items.get_attribute("href"))

            last_id = key_list[0]
        except:
            pass   # 异常抛出，处理下一条记录
    if len(spider_items) > 0:
        insert_spider_db()
    time.sleep(0.3)   # 休眠0.3秒
    driver.quit()


# 组织sql语句
def insert_spider_db():
    n_temp = 0
    if len(spider_items_href) > 0:
        for items in spider_items_href:
            # 组织插入spider记录表的sql语句
            temp_list = spider_items[n_temp]
            try:
                # 对None为空时进行判断处理
                if (items != None) and (items != ''):
                    sql = '''insert into spider (src_web,src_link,src_keyword,src_keyword_title,src_keyword_link,create_time)
                            select \''''+temp_list[0]+'''\',\''''+temp_list[1]+'''\',\''''+temp_list[2]+'''\',\''''+temp_list[3]+'''\',\''''+items+'''\',NOW() from dual
                            where not exists (select id from spider where src_keyword_link = \''''+items+'''\');
                            '''
                    # 分开记录提交旨在解决已存在时提交不上，影响无记录数据更新
                    if db_intf.update_sql(sql):
                        log_intf.running_log('【提交记录成功】'+temp_list[3]+' '+items)
                    else:
                        log_intf.running_log('【记录已存在 不更新数据库信息】'+temp_list[3]+' '+items)
            except:
                print(temp_list)  # 异常信息打出，仍处理下条
                print(items)
            n_temp += 1
    # 清空全局变量
    spider_items.clear()
    spider_items_href.clear()


# 主程序
if __name__ == '__main__':
    log_intf.mk_log()
    begin_time, end_time, debug_flag = log_intf.ini_sys_conn()     # 初始化参数
    if debug_flag == 1:
        message = '关键字搜索：运行段时间：'+str(begin_time)+'点--'+str(end_time)+'点(显示运行日志)'
    else:
        message = '关键字搜索：运行段时间：'+str(begin_time)+'点--'+str(end_time)+'点(不显示运行日志)'
    log_intf.running_log(message)

    get_spider_list()
    print('---------------------------')
    if not b_running:
        sMsg = "关键字搜索：服务停止(原因：未定义抓取网站信息)"
        log_intf.error_log(sMsg)
    else:
        while b_running:
            i = int(time.strftime("%H", time.localtime()))
            if (i >= begin_time) and (i < end_time):
                start_time = time.time()
                start_spider()
                end_time = time.time()  # 记录程序结束时间
                total_time = end_time-start_time  # 计算程序执行耗时
                print("耗时：{0:.5f}秒" .format(total_time))  # 格式输出耗时
                print('---------------------------')
            else:
                log_intf.running_log("关键字搜索：服务暂停（非运行时间段内）")
                time.sleep(60*10)  # 休眠60*10秒